package com.shujia.day03;

public class Demo09FunctionReload {
    public static void main(String[] args) {
        /*
            TODO 方法递归
                 注意:
                     1.方法内部调用自身
                     2.方法递归需要有停止标记  如果没有停止标记那么会出现 栈内存溢出错误 java.lang.StackOverflowError

                 需求: 完成 5!计算  => N! 怎么做
         */
        int res = reloadFun();
        System.out.println(res);

        System.out.println(reloadFun(5)); // 120

        /*
            TODO 递归函数的调用逻辑 以 reloadFun(3)为例
                 reloadFun(3) n =3
                    ->  n * reloadFun(n-1); n = 3  (必须先将 n * reloadFun(n-1); 计算完成才能执行return 返回数据 )
                      ->  reloadFun(2)
                        ->  n * reloadFun(n-1); n = 2
                          ->  reloadFun(1)
                          ->  return 1;
                        ->  reloadFun(2) = n * reloadFun(1) => 2 * 1 = 2
                    -> 3 * reloadFun(2) = 3 * 2 = 6
                 程序执行结束
         */

        reloadFunLong(10);

    }

    public static int reloadFun(){
        return 5*4*3*2*1;
    }

    // 函数的递归调用
    public static int reloadFun(int n){
        System.out.println("接收到N:"+n);
        // 当n不等于1时调用自身,等于1时返回结果1
        if (n == 1){
            return 1;
        }else {
            return n * reloadFun(n-1);
        }
    }

    public static int reloadFunLong(long n){
      return  reloadFunLong(n-1);
    }
}
